package guet.imagan.progbuilder.annotation;

import java.lang.annotation.*;

/**
 * 表示执行编译操作的命令行命令.
 * 该注解作用在继承于Compiler的具体子类上，用来
 * 向注解处理器提供创建Compiler具体子类的对象的必需的信息。
 */
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
public @interface CompileCommand {
	/**
	 * 出现在调用编译器编译的命令行中的默认的占位符常量，它表示项目中的第1个源文件
	 */
	String sourceFile="{srcFile}";
	/**
	 * 出现在调用编译器编译的命令行中的默认占位符常量，它表示项目中的所有源文件
	 */
	String sourceFiles="{srcFiles}";
	/**
	 * 表示编译生成的文件放置的目录路径
	 */
	String targetPath="{targetPath}";

	/**
	 * 编译器的显示名称，默认为空字符串
	 */
	String commpilerName() default "compiler";

	/**
	 * 编译器能够编译的源文件的扩展名,例如，gcc编译器，能够处理c和cpp两种扩展名，则
	 * 该属性取值为"sourceFileExtension={"c","cpp"}"
	 *
	 * @return
	 */
	String[] sourceFileExtension();

	/**
	 * 编译器编译成功后生成的目标文件扩展名。
	 * 例如C语言，c++语言，对应的值”exe"，而Java语言
	 * 则对应的值为"class"
	 *
	 * @return 编译生成的目标文件的扩展名
	 */
	String targetFileExtension();

	/**
	 * 编译命令行以空格分割后构成的字符串数组，数组中的元素按索引号先后排列且用空格作为分隔符，将构成一个可以运行程序的命令行
	 * 该数组中的元素（字符串）既包含固定不变的字符串，也可包含运行时被实际内容取代的若干占位符，占位符的格式如下：
	 * "{X}",其中X为具有特定意义的单词，其可能的取值如下：
	 * (1) srcFile：表示占位符对应的是1个源程序文件的完整路径，运行时，将被要编译的源程序文件完整路径字符串
	 * （例如”c:\\test\\test.c"）取代。
	 * (2) srcFiles:表示占位符对应的使1个或1个以上的源程序文件的完整路径，运行时，将被要编译的源程序文件路径取代。
	 * 假设有两个源文件（“c:\\test\\fun1.c","c:\\test\\fun2.c")则，它们将分别作为2个独立的参数放到命令行的占位符位置。
	 * (3)targetPath:编译生成的文件放置的目标路径，运行时，将被项目实际的目标路径或目标文件替换。
	 * 应用举例：对于gcc编译器，{"gcc","-finput-charset=utf-8",
	 * "-fexec-charset=GBK","{srcFiles}","-o","{targetPath}"}
	 * 这里{srcFiles}是一个占位符，表示源文件列表，编译时将被实际的源文件填充
	 *
	 * @return
	 */
	String[] command();



}
